package com.zzl.admin.service.admin.impl;

import com.zzl.admin.dao.base.BaseDao;
import com.zzl.admin.dao.admin.UserDao;
import com.zzl.admin.entity.admin.Role;
import com.zzl.admin.entity.admin.User;
import com.zzl.admin.service.admin.RoleService;
import com.zzl.admin.service.admin.UserService;
import com.zzl.admin.service.base.impl.BaseServiceImpl;
import com.zzl.admin.utils.EmptyUtil;
import com.zzl.admin.utils.MD5Utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import java.util.*;
import java.util.stream.Collectors;

/**
 * Description：用户服务接口实现类
 * Created by 朱正磊 on 2019-03-22 17:42
 */
@Service
public class UserServiceImpl extends BaseServiceImpl<User, Integer> implements UserService {

    private final UserDao userDao;

    private final RoleService roleService;

    @Autowired
    public UserServiceImpl(UserDao userDao, RoleService roleService) {
        this.userDao = userDao;
        this.roleService = roleService;
    }

    @Override
    public BaseDao<User, Integer> getBaseDao() {
        return userDao;
    }

    /**
     * description：根据用户名查找唯一用户
     * user 朱正磊
     * time 2019-03-23 14:33
     * @param username 用户名
     * @return 返回用户
     */
    @Override
    public User findByUserName(String username) {
        return userDao.findByUserName(username);
    }

    /**
     * description：增加或者修改用户
     * user 朱正磊
     * time 2019-03-23 14:34
     * @param user 用户对象
     */
    @Override
    public void saveOrUpdate(User user) {
        if (EmptyUtil.isNotEmpty(user.getId())) { //主键不为空表示修改
            User dbUser = findById(user.getId()); //根据主键查找唯一数据

            //设置属性值
            dbUser.setNickName(user.getNickName()); //昵称
            dbUser.setSex(user.getSex()); //性别
            dbUser.setBirthday(user.getBirthday()); //出生日期
            dbUser.setTelephone(user.getTelephone()); //电话
            dbUser.setEmail(user.getEmail()); //邮箱
            dbUser.setAddress(user.getAddress()); //住址
            dbUser.setLocked(user.getLocked()); //是否锁定
            dbUser.setDescription(user.getDescription()); //用户描述
            dbUser.setUpdateTime(new Date()); //更新时间

            update(dbUser); //更新一条记录
        } else { //主键为空表示增加
            //设置基本属性值
            user.setCreateTime(new Date()); //创建时间
            user.setUpdateTime(new Date()); //更新时间
            user.setDeleteStatus(0); //默认未逻辑删除
            user.setPassword(MD5Utils.md5("111111")); //默认密码6个1，进行MD5加密
            save(user); //保存记录
        }
    }

    /**
     * description：给用户分配角色
     * user 朱正磊
     * time 2019-03-23 14:34
     * @param id 用户ID
     * @param roleIds 角色Ids
     */
    @Override
    public void grant(Integer id, String[] roleIds) {
        //1、根据ID查询用户
        User user = findById(id);

        //2、非空验证
        Assert.notNull(user, "该用户不存在！");

        //3、验证是否是超级管理员用户
        Assert.state(!"admin".equals(user.getUserName()), "不能修改超级管理员用户的管理角色！");

        //4、给用户分配角色
        Set<Role> roles = new HashSet<>();
        if (EmptyUtil.isNotEmpty(roleIds)) {
            //1、传统写法
            /*for (String roleId : roleIds) {
                roles.add(roleService.findById(Integer.valueOf(roleId)));
            }*/

            //2、lambda写法
            roles.addAll(Arrays.stream(roleIds)
                    .map(e -> roleService.findById(Integer.valueOf(e)))
                    .collect(Collectors.toSet()));
        }
        user.setRoles(roles);

        //5、更新用户
        update(user);
    }

    /**
     * description：根据查询条件获取分页
     * user 朱正磊
     * time 2019-03-23 14:35
     * @param searchText 查询条件
     * @param pageRequest 分页请求对象
     * @return 返回分页对象
     */
    @Override
    public Page<User> findAllByLike(String searchText, PageRequest pageRequest) {
        if (EmptyUtil.isEmpty(searchText)) {
            searchText = "";
        }
        //根据昵称模糊查询分页记录
        return userDao.findAllByNickNameContaining(searchText, pageRequest);
    }

    /**
     * 提醒：该方法使用了断言，在controller里面调用的时候需要进行异常捕获
     * description：修改用户密码
     * user 朱正磊
     * time 2019-03-23 14:35
     * @param user 用户对象
     * @param oldPassword 原始密码
     * @param password1 新密码
     * @param password2 确认密码
     */
    @Override
    public void updatePwd(User user, String oldPassword, String password1, String password2) {
        //1、参数非空验证
        Assert.notNull(user, "用户不能为空！");
        Assert.notNull(oldPassword, "原始密码不能为空！");
        Assert.notNull(password1, "新密码不能为空！");
        Assert.notNull(password2, "确认密码不能为空！");

        //2、根据用户名查找唯一用户
        User dbUser = userDao.findByUserName(user.getUserName());
        Assert.notNull(dbUser, "该用户不存在！");

        //3、验证原始密码、新密码、确认密码
        Assert.isTrue(Objects.equals(user.getPassword(), MD5Utils.md5(oldPassword)), "原始密码不正确！");
        Assert.isTrue(Objects.equals(password1, password2), "两次密码输入不一致！");

        //4、设置新密码并更新
        dbUser.setPassword(MD5Utils.md5(password1));
        update(dbUser);
    }

}
